// 1.1类型断言as,字面理解就是可以用来手动指定一个值的类型——有时候ts无法获取具体的类型信息就要访问其中一个类型，这时我们就需要使用类型断言as或者断言另一种形式尖括号<类型>。推荐使用as

/* function getLen(str:string|number){
    return str.length;   //这时会报错-因为number类型没有length属性而报错
}
console.log(getLen('aa'))
 */

//解决办法
 function getLen(str:string|number){
    return (str as string).length  //用断言as,
    // return (<string>str).length  //断言另一种形式尖括号<类型>
    // return (str as boolean).length  //注意：类型断言不是类型转换，断言成一个联合类型中不存在的类型是不允许的。会报错
}
console.log(getLen('aa')) 

//1.2 使用断言注意问题-类型断言应该少用

//2.函数约束
//2.1 js中使用函数
/* function addNum(x,y){
    return x + y
}
console.log(addNum(1,2)) */

//2.2 ts中使用函数。TS中，一个函数要有输入（参数）和输出（返回值），我们在ts内要对其输入和输出进行约束
// 对输入（参数）的约束是在每个参数后面写上 :类型
// 对输出（返回值）的约束是在函数名()后写上 :类型
function addNum(x:number,y:number):number{
    return x + y
}
// addNum() // 报错： 应有 2 个参数，但获得 0 个。
// addNum(1) //报错： 应有 2 个参数，但获得 1 个。
// addNum(1,2,3) //报错： 应有 2 个参数，但获得 3 个。
addNum(1,2)


//2.3 注意不要混淆了 TypeScript 中的 => 和 ES6 中的 =>  。在 TypeScript 的类型定义中，=> 用来表示函数的定义，左边是输入类型，需要用括号括起来，右边是输出类型。*
/* var addNum1:(x:number,y:number)=>number = function(x:number,y:number):number{
    return x + y
}

addNum1(1,2) */

//2.4 接口+表达式约束-采用函数表达式|接口定义函数的方式时，对等号左侧进行类型限制，可以保证以后对函数名赋值时保证参数个数、参数类型、返回值类型不变
//定义接口
/* interface Ifun {
    (x:number,y:number):number
}
// 接口约束函数
var addNum2:Ifun = function(x:number,y:number):number{
    return x + y
}
addNum(1,2) */

export {}